package generic;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/*
 * @program JavaBase
 * @description:
 * @author: zhanglu
 * @create: 2019-06-07 16:56:00
 *
 * 泛型：
 * 1、集合中使用泛型 没有使用/使用
 * 2、自定义泛型类、泛型接口、泛型方法
 * 3、泛型与继承关系
 * 4、通配符<?>

 * 注意：
 *  不可以在static方法中使用泛型的声明
 *  不可以在try-catch中使用泛型的声明
 */
public class TestGeneric02 {

    //自定义泛型类、泛型接口、泛型方法
    @Test
    public void test01(){
        Order<String,Integer> o = new Order<>();
        o.setT("zhangsan");
        o.setE(20);
        System.out.println(o);

        Integer e1 = o.getT(22);
        Double e2 = o.getT(23.3);
    }

    /**
     * 通配符<?>
     *
     * ? extends A ： 可以存放A及其子类
     * ? super A ：可以存放A及其父类
     */
    @Test
    public void test02(){
        List<?> l1 = null;
        List<Object> l2 = null;
        List<String> l3 = null;

        l1 = l2;
        l1 = l3;

        List<? extends Number> l4 = null;
        List<Integer> l5 = null;
        l4 = l5;

        List<? super String> l6 = null;
        l6 = l3;
        l6 = l2;
    }

    /**
     * 通配符的使用
     */
    @Test
    public void test03(){
        List<String> list = new ArrayList<>();
        list.add("AA");
        list.add("BB");
        List<?> l = list;
        //可以读取声明为通配符的集合类的对象
        Iterator<?> iter = l.iterator();
        while (iter.hasNext()){
            //认为是元素都是object类型
            System.out.println(iter.next() instanceof Object);
            System.out.println(iter.next());
        }
        //不允许向声明为通配符的集合类中写入对象，唯一例外的：可以存null
//        l.add(22);

    }


}
